Blog

Java 14: „Ein wenig wie in den frühen Tagen von Java …“

28 Feb 2020

Pünktlich zum baldigen Erscheinen von Java 14 haben wir uns mit unserem weithin bekannten Java-Experten Dr. Heinz Kabutz unterhalten. Was ihm an Java 14 gut und weniger gut gefällt, woran er gerade arbeitet und was ihn auch 2020 noch ein wenig stört, erfahrt Ihr im nachfolgenden Gespräch.

JAXenter: Was ist Deines Erachtens das wichtigste neue Feature in Java 14?

Dr. Heinz Kabutz: Vor einigen Monaten beschwerte sich Brian Goetz auf der Java-Champion-Mailingliste, dass sie bei Oracle nicht genug Feedback zu ihren Vorschaufunktionen seitens der Community bekommen. Daraufhin beschloss ich, meine Website von nun an immer mit der neuesten Preview Version von Java zu betreiben. Wenn man sich die Website jetzt ansieht, sieht man oben „Running on Java 14-ea+29-1384 (Preview)“. Es ist ein bisschen Arbeit, das so zu machen. Neben meinem Master Branch habe ich drei weitere Branches für die Java-14-Funktionen: java14-preview, jep359 (Records) und jep368 (text blocks). Im Allgemeinen arbeite ich im Master, aber die drei anderen Branches werden dann davon abgeleitet.

Man könnte vermuten, dass JavaSpecialists.eu nur eine Hobby-Website ist und dass es nicht viel Risiko bergen würde, wenn sie down wäre. Das ist jedoch nicht der Fall. Sie ist mein täglich Brot. Ohne sie hättet ihr nie etwas von mir gehört. Ich kann mir auf keinen Fall leisten, dass sie abgeschaltet wird und setze also ein ständiges Monitoring ein, um zu überprüfen, ob alles noch funktioniert.

Aber zum Kern der Frage: Von allen Funktionen, die in Java 14 enthalten sind, gefallen mir Records (JEP359) am besten. Eine interessante Neuerung ist jedoch ebenfalls, dass ConditionNode innerhalb des AbstractQueuedSynchronizer jetzt auch ein ManagedBlocker ist. Das bedeutet, dass die Bedingung von ReentrantLock gut mit dem ForkJoinPool und damit mit parallelen Streams zusammenspielt. LinkedBlockingQueue basiert auf ReentrantLock, und so arbeitet auch das gut zusammen. Ich habe auf meiner Webseite über die diesbezüglichen Möglichkeiten geschrieben und schlage einen Hack vor, um LinkedBlockingQueue zu fixen. Mit Java 14 funktioniert es out-of-the-box.

JAXenter: Womit beschäftigst Du Dich gerade?

Dr. Heinz Kabutz: Ich bin damit beschäftigt, ein Buch über Dynamic Proxys in Java zu schreiben. Ich habe vor vielen Jahren eine deutsche Version verfasst, aber hierbei handelt es sich um eine komplette Neufassung. Das, was die meiste Zeit verschwendet hat, war das Java Platform Module System (JPMS). Wir haben Tage damit verbracht, zu versuchen, Maven, IntelliJ und JPMS dazu zu bringen zusammenzuarbeiten. Mit der Hilfe unserer Java-Champions Simone Bordet und Robert Scholte ist es uns schließlich gelungen. Wir leben im Jahre 2020 und die Funktionen von Java 9 funktionieren in der Tool Chain immer noch nicht richtig!

[marketing_widget_area 1]

JAXenter: Nähert sich Java durch Features wie „JEP-358: Helpful NullPointerExceptions“ „modernen“ Sprachen wie Kotlin an?

Dr. Heinz Kabutz: „Modern“ ist gut. Die Herausforderung bei einer Sprache wie Kotlin besteht darin, dass sie auch ältere JVMs unterstützen muss. Eine ganze Reihe von schönen neuen Java-Performance-Verbesserungen sind noch nicht in Kotlin verfügbar. Zum Beispiel wurde String überarbeitet, um ein schnelles Anhängen mit + zu ermöglichen. Der von Kotlin generierte Bytecode ist jedoch immer noch der von Java 8.

Mir gefällt, wie Kotlin die gefürchtete NullPointerException vermeidet. Leider sind die „Helpful NullPointerExceptions“ davon ziemlich weit entfernt. Stattdessen zeigen sie einfach einige zusätzliche Informationen über das, was Null war, anstatt die Möglichkeit der NullPointerException ganz zu vermeiden.

JAXenter: Welche Wünsche/Präferenzen hast Du für das ebenfalls noch in diesem Jahr erscheinende Java 15?

Dr. Heinz Kabutz: Dass sie Records so schnell wie möglich fertigstellen. Das ganze Konzept scheint gut durchdacht, auch die Art und Weise, wie die Serialisierung funktioniert, ist clever.

JAXenter: Was hältst Du generell von der Beschleunigung, die Java durch den sechsmonatigen Releasezyklus erlebt?
Kabutz: Es ist ein wenig chaotisch und schwer zu merken, welche Features zu welcher Version gehören. Die meisten Firmen arbeiten noch mit Java 8. Diejenigen, die sich weiterentwickelt haben, verwenden Java 11. Nur sehr wenige sind mutig (oder dumm) genug, um mit der neuesten, hochmodernen JVM zu arbeiten.
Dennoch macht es mir Spaß, die neuen Funktionen nachzuschlagen und auszuprobieren. Es fühlt sich ein wenig an wie in den frühen Tagen von Java, als wir ziemlich regelmäßig große Fortschritte verbuchen konnten.

JAXenter: In Deinem Extreme Java Camp geht es unter anderem um den Einsatz von Java-8-Streams und Lambdas – gibt es irgendwelche Best Practices, die Du mit den Lesern teilen kannst?

Dr. Heinz Kabutz: Streams können dazu beitragen, den Code viel einfacher verständlich zu machen, wenn sie richtig eingesetzt werden. In unserem Workshop refaktorisieren wir Klassen, um Streams zu verwenden. Nachdem wir einen Tag damit verbracht haben, „Wegwerfcode“ zu erstellen, bekommen wir eine sehr gute Vorstellung davon, wo und wann wir Streams verwenden sollten.

Hier ein Top-Tipp für diejenigen, die nicht ständig Lambdas verwenden: Schreibt Code mit anonymen inneren Klassen und verwendet dann das Refactoring in eurer IDE, um ihn halbautomatisch in Lambdas zu konvertieren. Nachdem wir das hundertmal gemacht haben, wird es einfach und wir können die Lambdas direkt schreiben.

JAXenter: Auch über Java Threads klärst Du die Leute auf. Warum sind sie so wichtig?

Kabutz: Jedes Stück Java-Code, das jemals ausgeführt wurde, wurde in einem Thread ausgeführt. Wir müssen unbedingt verstehen, was Threads sind und wie man sie verwendet, damit wir Fallstricke vermeiden, die uns in unseren Projekten schaden können. Zum Beispiel habe ich gestern eine Übung für einen neuen Kurs geschrieben, den ich über dynamische Proxies in Java erstelle. Während der Ausführung stellten wir fest, dass es manchmal eine unerwartete NullPointerException gab, was aber nicht die ganze Zeit passierte. Das sah ziemlich nach einer race condition aus. Es passierte jedoch auch, wenn es mit einem einzelnen Thread ausgeführt wurde. Mit den Techniken aus unserem Kurs habe ich das Problem schnell eingegrenzt. Es war tatsächlich eine Race Condition, aber zwischen den JVM Garbage Collector Threads und meiner Anwendung. Das Hinzufügen einer Sperre hätte nicht geholfen. Zu verstehen, wonach man suchen muss und wie man die Probleme diagnostiziert, erspart viele Stunden Frustration.

Keine Infos mehr verpassen!

ALLE NEWS ZUM EXTREME JAVA CAMP!